using DG.Tweening; // 使用DOTween动画系统
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 敌人系统管理器，负责敌人的生成、行动和死亡逻辑
/// 采用单例模式保证全局唯一访问
/// </summary>
public class EnemySystem : Singleton<EnemySystem>
{
    [Header("视图引用")]
    [SerializeField] private EnemyBoardView enemyBoardView; // 敌人战场视图控制器

    /// <summary>
    /// 当前所有敌人视图的只读集合
    /// </summary>
    public List<EnemyView> Enemies => enemyBoardView.EnemyViews;

    #region 生命周期管理
    private void OnEnable()
    {
        // 注册游戏动作处理器
        ActionSystem.AttachPerformer<EnemyTurnGA>(EnemyTurnPerformer);   // 敌人回合
        ActionSystem.AttachPerformer<AttackHeroGA>(AttackHeroPerformer); // 攻击英雄
        ActionSystem.AttachPerformer<KillEnemyGA>(KillEnemyPerformer);   // 击杀敌人
    }

    private void OnDisable()
    {
        // 注销游戏动作处理器
        ActionSystem.DetachPerformer<EnemyTurnGA>();
        ActionSystem.DetachPerformer<AttackHeroGA>();
        ActionSystem.DetachPerformer<KillEnemyGA>();
    }
    #endregion

    /// <summary>
    /// 初始化敌人系统
    /// </summary>
    /// <param name="enemyDatas">敌人数据集合</param>
    public void SetUP(List<EnemyData> enemyDatas)
    {
        foreach (var enemyData in enemyDatas)
        {
            // 根据敌人数据创建敌人并添加到战场
            enemyBoardView.AddEnemy(enemyData);
        }
    }

    #region 敌人行为处理
    /// <summary>
    /// 处理敌人回合逻辑（协程）
    /// </summary>
    private IEnumerator EnemyTurnPerformer(EnemyTurnGA action)
    {
        //   Debug.Log("敌人回合开始");
        // 遍历所有敌人执行回合行动

        if(enemyBoardView.EnemyViews.Count == 0)
        {
            ActionSystem.instance.AddReaction(new WaveGA("结束回合"));
        }
        else
        {
            ActionSystem.instance.AddReaction(new WaveGA("敌人回合"));
            foreach (var enemy in enemyBoardView.EnemyViews)
            {
                // 检查并处理燃烧效果
                int burnStacks = enemy.GetStatusEffectStackCount(StatusEffectType.BURN);
                if (burnStacks > 0)
                {
                    ApplyBurnGA applyBurnGA = new(burnStacks, enemy);
                    ActionSystem.instance.AddReaction(applyBurnGA);
                }

                // 执行攻击英雄动作
                AttackHeroGA attackHeroGA = new(enemy);
                ActionSystem.instance.AddReaction(attackHeroGA);
            }
            ActionSystem.instance.AddReaction(new HeroTurnGA());
        }
        yield return null; // 等待一帧
    }

    /// <summary>
    /// 处理敌人攻击英雄逻辑（协程）
    /// </summary>
    private IEnumerator AttackHeroPerformer(AttackHeroGA attackHeroGA)
    {
        EnemyView attacker = attackHeroGA.Attacker;

        // 执行攻击动画：先向后移动再复位
        Tween tween = attacker.transform.DOMoveX(attacker.transform.position.x - 1f, 0.1f);
        yield return tween.WaitForCompletion();
        attacker.transform.DOMoveX(attacker.transform.position.x + 1f, 0.1f);

        // 创建造成伤害的游戏动作
        DealDamageGA dealDamageGA = new(
            attacker.AttackPower,                // 伤害值
            new() { HeroSystem.instance.HeroView }, // 目标列表
            attackHeroGA.Caster                  // 伤害来源
        );
        ActionSystem.instance.AddReaction(dealDamageGA);
    }

    /// <summary>
    /// 处理击杀敌人逻辑（协程）
    /// </summary>
    private IEnumerator KillEnemyPerformer(KillEnemyGA killEnemyGA)
    {
        // 从战场移除敌人视图
        yield return enemyBoardView.RemoveEnemy(killEnemyGA.EnemyView);
    }
    #endregion
}